No need for a big clump of stupidity in 21990...

7F04F9F8:	84528	display ammo collection text
	accepts: A0=type, A1=amount
27BDFF80	ADDIU	SP,SP,FF80
AFA40080	SW	A0,0080 (SP)
27A4001C	ADDIU	A0,SP,001C
00A03025	OR	A2,A1,R0
8FA50080	LW	A1,0080 (SP)
AFBF0014	SW	RA,0014 (SP)
00804025	-OR	T0,A0,R0
25190060	*ADDIU	T9,T0,0060
//7F04FA20:
25080010	*ADDIU	T0,T0,0010
AD00FFF0	*SW	R0,FFF0 (T0)
AD00FFF4	*SW	R0,FFF4 (T0)
AD00FFF8	*SW	R0,FFF8 (T0)
1519FFFB	*BNE	T0,T9,7F04FA20
AD00FFFC	*SW	R0,FFFC (T0)
//7F04FA44:
0FC13E48	JAL	7F04F920
AD000000	*SW	R0,0000 (T0)
//7F04FA50:
0FC228F2	JAL	7F08A3C8
27A4001C	ADDIU	A0,SP,001C
//7F04FA58:
8FBF0014	LW	RA,0014 (SP)
03E00008	-JR	RA
27BD0080	+ADDIU	SP,SP,0080
00000000	NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP


//7F04F978:	844A8	append newline
3C050A00	*LUI	A1,0A00
AFA50014	*SW	A1,0014 (SP)
0C0029FF	JAL	7000A7FC	;append newline
27A50014	*ADDIU	A1,SP,0014


//7F04F9D0:	84500	append end of sentence
3C052E0A	*LUI	A1,2E0A
AFA50014	*SW	A1,0014 (SP)
0C0029FF	JAL	7000A7FC	;strcat(A0,"./r")
27A50014	*ADDIU	A1,SP,0014


+_+

add all ammo type descriptors here...
also, turn the table at 80052F30 (0x321A0)into a table of text IDs
pluralize flags:	80052F68
11110100 11111111 01111111 00100000
F4 FF 7F 20

80052F2E:
A405 #### A405
A406 A409 A40B A40C
A40D A40E ---- A40A
A407 A408 A413 A414
A415 A416 A417 ----
A41B A41C A41D A41F
++++ ++++ ---- ^^^^
---- A41E

#### tank shell
++++ recharge, nonpluralize!
^^^^ will be film, nonpluralize!


7F04F40C:	83F3C	append ammo name to string
	accepts: A0=p->final, A1=type, A2=quantity
27BDFFE0	ADDIU	SP,SP,FFE0
AFB00018	SW	S0,0018 (SP)
24020001	ADDIU	V0,R0,0001
00808025	OR	S0,A0,R0	;S0=A0: p->final
AFBF001C	SW	RA,001C (SP)
AFA50014	*SW	A1,0014 (SP)
24C1FFFF	*ADDIU	AT,A2,FFFF	;this allows you to do a simple <=0 test
AFA10028	*SW	AT,0028 (SP)	;SP+28=AT: quantity-1
24010018	*ADDIU	AT,R0,0018
10A10004	BEQ	A1,AT,7F04F444	;branch if type watch laser
340498D2	*ORI	A0,R0,98D2	;A0=98D3: "watch laser/r"
24840001	*ADDIU	A0,A0,0001
24010019	*ADDIU	AT,R0,0019
14A1000E	*BNE	A1,AT,7F04F478	;branch if type watch magnet
2401000A	ADDIU	AT,R0,000A
//7F04F448:	watch ammo types
0FC30776	JAL	7F0C1DD8	;V0=p->text ID A0
00000000	*NOP
00102025	OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	JAL	7000A7FC	;strcat(A0,A1)
00022825	OR	A1,V0,R0	;A1=V0: p->text
0C004E1F	*JAL	7001387C	;strlen(A0)
00102025	*OR	A0,S0,R0	;A0=S0: p->final
00442021	*ADDU	A0,V0,A0	;A0=p->terminating NULL
9082FFFF	*LBU	V0,FFFF (A0)	;V0=last character
50220001	*BEQL	AT,V0,+1	;overwrite if /r
A080FFFF	*SB	R0,FFFF (A0)
10000025	*BEQ	R0,R0,7F04F50C	;jump to the main table now for " recharge"
00000000	*NOP
//7F04F478:	throwing knives
14A10011	*BNE	A1,AT,7F04F4C0	;branch if not type A
24010013	ADDIU	AT,R0,0013
0FC30776	JAL	7F0C1DD8	;V0=p->text ID A0
3404A40F	ORI	A0,R0,A40F	;A0=A40F: "throwing "
00102025	OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	JAL	7000A7FC	;strcat(A0,A1)
00022825	OR	A1,V0,R0	;A1=V0: p->text
8FA10028	*LW	AT,0028 (SP)	;T6=quantity
5C200002	*BGTZL	AT,+2
3404A411	*ORI	A0,R0,A411	;A0=A411: "knives"
//7F04F4A0:	single/multiple knife
3404A410	ORI	A0,R0,A410	;A0=A410: "knife"
0FC30776	JAL	7F0C1DD8	;V0=p->text ID A0
00000000	*NOP
00102025	OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	JAL	7000A7FC	;strcat(A0,A1)
00022825	OR	A1,V0,R0	;A1=V0: p->text
10000038	*BEQ	R0,R0,7F04F774
00000000	*NOP
//7F04F4C0:	dynamite
24010013	ADDIU	AT,R0,0013	;EXTRONEOUS
14A10010	BNE	A1,AT,7F04F524	;branch if not type 13
8FAF0028	LW	T7,0028 (SP)	;T7=quantity
3404A419	*ORI	A0,R0,A419	;A0=A419: "stick "
5DE00001	*BGTZL	T7,+1	;branch if multiples
24840001	*ADDIU	A0,A0,0001
//7F04F4D8:	single/multiple
0FC30776	JAL	7F0C1DD8	;V0=p->text ID A0
00000000	*NOP
00102025	OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	JAL	7000A7FC	;strcat(A0,A1)
00022825	OR	A1,V0,R0	;A1=V0: p->text
//7F04F4EC:	append "of dynamite"
0FC30776	*JAL	7F0C1DD8	;V0=p->text ID A0
3404A418	*ORI	A0,R0,A418	;A0=A418: "of dynamite"
00102025	*OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	*JAL	7000A7FC	;strcat(A0,A1)
00022825	*OR	A1,V0,R0	;A1=V0: p->text
10000026	*BEQ	R0,R0,7F04F774
00000000	*NOP
//7F04F50C:	all non-special case ammo types
8FB80014	*LW	T8,0014 (SP)	;T8=type
2F01001E	*SLTIU	AT,T8,001E
10200005	BEQ	AT,R0,7F04F528	;branch if not type 4-1D: DEFAULT
0018C040	*SLL	T8,T8,0x1	;T8=type->offset
3C018005	LUI	AT,8005
00380821	ADDU	AT,AT,T8
94242F2C	*LHU	A0,2F2C (AT)	;A0=80052F94+offset: text value for thingy
14800007	*BNEZ	A0,7F04F544	;branch if a value present
3C013F00	*LUI	AT,3F00
//7F04F52C:	default for unknown strings
AFA10014	*SW	AT,0014 (SP)
00102025	*OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	*JAL	7000A7FC	;strcat(A0,A1)
27A50014	*ADDIU	A1,SP,0014
10000017	*BEQ	R0,R0,7F04F774	;return
00000000	*NOP
//7F04F544	pull text and append it
0FC30776	*JAL	7F0C1DD8	;V0=p->text ID A0
00000000	*NOP
00102025	*OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	*JAL	7000A7FC	;strcat(A0,A1)
00022825	*OR	A1,V0,R0	;A1=V0: p->text
//7F04F758:	pluralize if required
8FA10028	*LW	AT,0028 (SP)	;SP+28=AT: quantity-1
1820000F	*BLEZ	AT,R0,7F04F774	;branch if singular
3C018005	*LUI	AT,8005
8FA50014	*LW	A1,0014 (SP)	;T8=type
0005C0C2	*SRL	T8,A1,0x3	;T8=byte for singularity flag
00380821	*ADDU	AT,T8,AT
90212F68	*LBU	AT,2F68 (AT)	;AT=80052F30+offset
30B80007	*ANDI	T8,A1,0007	;T8=bit within flag
03010806	*SRLV	AT,AT,T8
30210001	*ANDI	AT,AT,0001	;AT=flag
10200006	*BEQ	AT,R0,7F04F774	;return if it is its own plural
00000000	*NOP
0FC30776	JAL	7F0C1DD8	;V0=p->text ID A0
3404A412	ORI	A0,R0,A412	;A0=A412: "s"
00102025	OR	A0,S0,R0	;A0=S0: p->final
0C0029FF	JAL	7000A7FC	;strcat(A0,A1)
00022825	OR	A1,V0,R0	;A1=V0: p->text
//7F04F774:	return
00102025	*OR	A0,S0,R0	;A0=S0: p->final
8FBF001C	LW	RA,001C (SP)
8FB00018	LW	S0,0018 (SP)
03E00008	JR	RA
27BD0020	ADDIU	SP,SP,0020

TEST LINES:	48A52
9C9A061F	08101A19	1D1C8686
9C9A1B03	18121320	17218686